iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

golang 後端菜雞工程師學習雜記系列 第 10

Day10 - 讀 Concurrency is not Parallelism - Rob Pike (五)

  • 分享至 

  • xImage
  •  

昨日有點累,想說打個盹一下,結果醒來就隔天了,鐵人賽直接中斷。

續上篇,Day9 - 讀 Concurrency is not Parallelism - Rob Pike (四)

在上篇 Rob Pike 舉了一個簡單的 load balancer,在演講的尾聲,他提出了一個更真實的案例。
看下圖,大概分成三個部分

  • N 個 requester 發出 request 給 load balancer
  • N 個 worker 在工作
  • load balancer 接到 request 並且指派 worker 工作

定義 Requester

  • fn 定義了這個 request 想做什麼,此範例是做某些運算並且回傳 int
  • c 則是用來回傳 fn 運算完的結果

模擬 requester 發出 request
可以看到 work 這個參數用來發出 request,result 用來等待運算的結果


定義 Worker

  • requests 是要做的工作 (注意:這裡使用 buffered channel)
  • pending 代表有多少工作擱置
  • index 則是在 heap 裏的位置,這是給 load balancer 排程時用的

Worker 工作囉,就做三件事

  • 拿到工作
  • 做完之後把結果傳送給 requester (worker 做完的結果不會經過 load balancer。load balancer 只是一個媒介,把 request 送給當前比較適合的 woker,當 load balancer 把 requester 的 request 媒合到一個 worker 之後,就沒 load balancer 的事情了)
  • 跟 load balancer 說我做完了

來設計 load balacer 吧

  • 一個 load balancer 有很多 worker,這裡直接用 Pool 表示
  • 需要一個 done 的 channel 來知道哪一個 worker 做事做完了

load balancer 需要計算優先權,使用到了 Heap 資料結構,並使用 worker 的 pending 計算優先權


Load balancer 要做的事情概念很簡單。 回想一下一開始的設計圖:

  • 對於左邊的 requester,load balancer 要接收 request,並且派送工作
  • 對於右邊的 worker 而言,load balancer 要接收到 woker 做完的訊息,並且更新排程

load balancer 派發工作的實作:

  • 從 heap 裏拿出一個事情最少的 worker
  • 把 request 丟給 woker
  • 把 worker 的 pending 加 1
  • 重新丟回 heap (重新計算優先權)

load balancer 接收到 woker 做完工作後的實作:

  • 把 worker 的 pending 減 1
  • 把 woker 重 heap 中移除
  • 重新丟回 heap (重新計算優先權)


這個例子學到了:

  • 一個複雜的 load balancer 問題,被分解成好幾份簡單的元件
  • 這個解法是很容易理解的、可擴展的 (你可以指定多少個 worker)、可正常運行的、沒有顯式 lock (也就是傳統的 lock 工具)
  • 老話一句,至於要不要 parallel 就只是個選項而已。

這邊 Rob Pike 又講了一個小小的例子我就略過了,直接到結論:結論相當的簡單而且微言大義,留給自己去體會囉。

讀後心得

以往都是從 CPU 的觀點去解讀 concurrency 和 Parallelism,但 Rob Pike 從另一個觀點切入 ,直接給出了 Programming as the composition of independently executing processes 的觀點,使用 gopher 燒書的例子帶你了解 concurrency 設計。最後直接帶你一步一步設計一個 load balancer,將一個複雜的問題切割成簡單的子問題,並且使用 go 的 concurrnecy 完成這個漂亮的設計。這場演講,這個觀點和結論,只能佩服 Rob Pike 這個大師級人物。


上一篇
Day9 - 讀 Concurrency is not Parallelism - Rob Pike (四)
下一篇
Day11 休息一日放假一下
系列文
golang 後端菜雞工程師學習雜記18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言